perm filename TUTORI.PL[PRO,LOG] blob
sn#620883 filedate 1981-10-28 generic text, type T, neo UTF8
/* This file contains all the examples that appear in the prolog tutorial,
<F.PROLOG>TUTORI.LPT
It is divided into screens of 24 lines, so it can be used in a tutorial or
a demo. It can be consulted, and all the examples in it can be tried. */
/* reachability in a graph */
reachable(X,X).
reachable(X,Z) :- edge(X,Y), reachable(Y,Z).
edge(a,b).
edge(b,c).
edge(b,d).
edge(d,b).
/* list processing */
member(X,[X|←]).
member(X,[←|L]) :- member(X,L).
duplicate(X,L1,L2) :- member(X,L1), member(X,L2).
append([],L,L).
append([X|L1],L2,[X|L3]) :- append(L1,L2,L3).
intersect([],←,[]).
intersect([X|L1],L2,[X|L3]) :- member(X,L2), intersect(L1,L2,L3).
/* biblical data base */
father(abraham,isaac).
father(isaac,jacob).
father(isaac,esau).
father(jacob,reuben).
father(jacob,simon).
mother(sarah,isaac).
mother(rebecca,jacob).
mother(rebecca,esau).
parent(X,Y) :- father(X,Y).
parent(X,Y) :- mother(X,Y).
brother(X,Y) :- parent(Z,X), parent(Z,Y), X\==Y.
had←sex(X,Y) :- father(X,Z), mother(Y,Z).
uncle(X,Y) :- father(Z,Y), brother(X,Z).
grandmother(X,Y) :- mother(X,Z), parent(Z,Y).
/* global variables */
set(Name, Value) :- retractall(variable(Name,←)),
assert(variable(Name, Value)).
add1(Name, NewValue) :- retract(variable(Name, Value)),
NewValue is Value + 1,
assert(variable(Name, NewValue)).
/* stacks */
emptystack(Name) :- retractall(stack(Name, ←)),
assert(stack(Name, [])).
push(Name, Element) :- retract(stack(Name, List)),
assert(stack(Name, [Element | List])).
pop(Name, Element) :- retract(stack(Name, [Element | List])).
assert(stack(Name, List)).
/* A Prolog interpreter */
execute(true) :- !.
execute((P,Q)) :- !, execute(P), execute(Q).
execute(P) :- clause(P,Q), execute(Q).
/* Associative assoc in Prolog */
assoc(A,L,S) :- bagof(B,( member([A,B],L) ; member([B,A],L) ),S).
list([[a,b],[a,c],[c,d],[d,a],[d,b]]).
/* implementing an environment for Prolog */
trace(P) :- asserta((P :- trace, fail)).
notrace(P) :- retract((P :- trace, fail)).
mcsam(Story) :- write('Processing story '), nl, list←print(Story),
find(Story, Script, Defaults),
process(Script, Story),
name←defaults(Defaults),
nl, write('The instantiated script is: '), nl,
list←print(Script), !.
find(Story, Script, Defaults) :- filler(Slot, Story), suggest(Slot,Script←name),
script(Script←name, Script, Defaults),
write('Found script: '), write(Script←name), nl.
process(Script, []).
process([Line | Script], [Line | Story]) :- write(processing←line(Line)), nl,
process(Script, Story).
process([Line | Script], Story) :- process(Script, Story).
filler(Slot, Story) :- member([← | Args], Story),
member(Slot, Args), nonvar(Slot).
name←defaults([]).
name←defaults([[N,N]|L]) :- name←defaults(L).
name←defaults([[←,←]|L]) :- name←defaults(L).
suggest(leones, restaurant).
suggest(waiter, restaurant).
story([[ptrans, john, john, ←, leones],
[mtrans, ←, ←, hamburger],
[ptrans, Actor, Actor, ←, ←] ]).
script(restaurant,
[ [ptrans, Actor, Actor, Earlier←place, Restaurant],
[ptrans, Actor, Actor, Door, Seat],
[mtrans, Actor, Waiter, Food],
[atrans, Actor, Money, Actor, Waiter],
[ptrans, Actor, Actor, Restaurant, Gone] ],
[ [Actor, customer], [Earlier←place, place1], [Restaurant, restaurant],
[Door, door], [Seat, seat], [Food, meal], [Waiter, waiter],
[Money, check], [Gone, place2] ] ).
list←print([]) :- nl.
list←print([X | L]) :- display(X), nl, list←print(L).
% A program for automatically creating public declarations from mode
% declarations.
public(File1,File2) :-
see(File1),
tell(File2),
write(':- public'),
public1,
write('.'),
close(File1),
close(File2).
public1 :-
read(Term),
( Term=end←of←file, ! ;
( Term=(:-mode Mode),
functor(Mode,Functor,Arity),
nl, write(' '),
write(Functor/Arity),
write(',') ;
true ), !,
public1 ).
% Scribe indexing Program,
% every occurance "W" in Input of a word that is in WordsFile
% is replaced by "W @index(W)" in file Output
:-public(index/3).
:-mode getword(-),putindex(+),separator(+).
index(Input,Output,WordsFile) :-
see(WordsFile),
initialize,
see(Input),
tell(Output),
transform,
told.
initialize :-
read(Word),
( Word==end←of←file, ! ;
name(Word,List),
assert(index(List,Word)),
!, initialize ).
transform :-
getword(Word),
putindex(Word),
!, transform.
getword(Word) :-
get0(N), put(N),
( separator(N), !, Word=[] ;
Word=[N|Rest], getword(Rest) ), !.
putindex([]) :- !.
putindex(List) :-
call(index(List,Word)), !,
write('@index('),
write(Word),
write(')').
putindex(List).
separator(N) :- N<65, !.
separator(N) :- N>122, !.
separator(N) :- N>90, N<97.